package com.example.satokendemospringboot.controller;

import cn.dev33.satoken.stp.SaLoginConfig;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 登录测试
 */
@RestController
@RequestMapping("/acc/")
public class LoginController {

    // 测试登录  ---- http://localhost:8081/acc/doLogin?name=zhang&pwd=123456
    @RequestMapping("doLogin")
    public SaResult doLogin(@RequestParam String name,@RequestParam String pwd) {
        // 此处仅作模拟示例，真实项目需要从数据库中查询数据进行比对
        if("zhang".equals(name) && "123456".equals(pwd)) {

            // 记住我--->`SaLoginModel`为登录参数Model，其有诸多参数决定登录时的各种逻辑
            SaLoginModel saLoginModel = SaLoginConfig
                    .setDevice("PC")// 此次登录的客户端设备类型, 用于[同端互斥登录]时指定此次登录的设备类型
                    .setExtra("name","张三")
                    .setExtra("tenantId","1000001")
                    .setExtra("role","超级管理员")
                    .setIsLastingCookie(true)        // 是否为持久Cookie（临时Cookie在浏览器关闭时会自动删除，持久Cookie在重新打开后依然存在）
                    .setIsWriteHeader(true); // 是否在登录后将 Token 写入到响应头

            List<String> roleList = StpUtil.getRoleList(10001);
            saLoginModel.setExtra("roles", roleList);
            List<String> permissionList = StpUtil.getPermissionList(10001);
                                  saLoginModel.setExtra("permissions", permissionList);
            StpUtil.login(10001,saLoginModel);
            boolean b = StpUtil.hasPermission("user");
            System.out.println("当前登录用户是否拥有 user 权限"+b);
            return SaResult.ok("登录成功");
        }
        return SaResult.error("登录失败");
    }

    // 查询登录状态  ---- http://localhost:8081/acc/isLogin
    @RequestMapping("isLogin")
    public SaResult isLogin() {
        return SaResult.ok("是否登录：" + StpUtil.isLogin());
    }

    // 查询 Token 信息  ---- http://localhost:8081/acc/tokenInfo
    @RequestMapping("tokenInfo")
    public SaResult tokenInfo() {
        return SaResult.data(StpUtil.getTokenInfo());
    }

    // 测试注销  ---- http://localhost:8081/acc/logout
    @RequestMapping("logout")
    public SaResult logout() {
        StpUtil.logout();
        return SaResult.ok();
    }


}

